package cn.itsource.pethome.user.service.impl;

import cn.itsource.pethome.basic.service.impl.BaseServiceImpl;
import cn.itsource.pethome.user.domain.User;
import cn.itsource.pethome.user.mapper.UserMapper;
import cn.itsource.pethome.user.service.IUserService;
import cn.itsource.pethome.utils.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl extends BaseServiceImpl<User> implements IUserService {

    @Autowired
    private UserMapper userMapper;

    @Override
    public void checkPhone(String phone) {
        User user = userMapper.checkPhone(phone);
        if(user!=null){
            throw new RuntimeException("手机号已被注册");
        }
    }

    /*
        1.生成随机的验证码
        2.将验证码存入redis中，并设置过期时间为5分钟
        3.三大运营商发送短信

        问题:
         1.前台在一分钟之内发送两次
              1.1 提示用户一分钟之内不能重复发送
              1.2 如何判断距离上一次发送的时间间隔     存储时候 以前USER_REG
         2.超出60s以后在5分钟之内 重新发送问题
             2.1 验证码 重新生成一个 还是 就是上一次发送过的验证码
             2.2 再次发送上一次生成的验证码
         3.出超出5分钟  重新生成新的
            超出5分钟后，redis中的验证码已经过期，获取不到了，所以判断时为空
     */

    @Override
    public AjaxResult sendMobileCode(String phone) {
        try {
            //1.生成随机的验证码
            String code = StrUtils.getRandomString(6);
            //
            String codeAndTime = RedisUtils.INSTANCE.get("USER_REG" + phone);
            if(codeAndTime!=null){
                //Long.valueOf(codeAndTime.split(":")[1]  在数据库中查询出上一次存入的时间
                if(System.currentTimeMillis()-Long.valueOf(codeAndTime.split(":")[1])<60*1000){//重复发送在1分钟之内
                    return new AjaxResult("请不要在一分钟内多次获取验证码！");
                }else {//重复发送在1分钟之外，5分钟之内，将redis中原有的验证码发送
                    code=codeAndTime.split(":")[0];
                }
            }
        /*
            2.将验证码存入redis中，并设置过期时间为5分钟
                解决短时间内多次发送的问题，在向redis中存入验证码时，加上一个时间戳，
                对比两次存入的时间戳来判断两次存入的时间间隔
        */
            RedisUtils.INSTANCE.set("USER_REG"+phone, code+":"+System.currentTimeMillis(), 1*60*5);
            //发送验证码
//            SendMsg_webchinese.sendMsg(phone, code);
            System.out.println(code);
            return AjaxResult.me();
        } catch (Exception e) {
            e.printStackTrace();
            return new AjaxResult("网络延迟，请稍后再试");
        }

    }

    @Override
    public AjaxResult register(String code, User user) {
        String phone = user.getPhone();
        String codeAndTime = RedisUtils.INSTANCE.get("USER_REG" + phone);
        String redisCode = codeAndTime.split(":")[0];
        if(code.equals(redisCode)){ //将前端输入的验证码和redis中存储的验证码进行校验
            //获取盐值
            String complexRandomString = StrUtils.getComplexRandomString(32);
            String password = user.getPassword();
            //将盐值追加在密码后面再加密
            password=password+complexRandomString;
            //加密
            password=MD5Utils.encrypByMd5(password);
            //将盐值和密码重新注入对象中
            user.setPassword(password);
            user.setSalt(complexRandomString);

            userMapper.register(user);
            return AjaxResult.me();
        }
        return new AjaxResult("验证码错误！");
    }

    @Override
    public User login(User user) {
        User loginUser = userMapper.checkPhone(user.getUsername());
        if(loginUser==null){ //说明数据库中没有此用户
            throw new RuntimeException("用户名不存在");
        }else{ //说明数据库中有该用户，再进行密码的验证
            if(!loginUser.getPassword().equals(MD5Utils.encrypByMd5(user.getPassword()+loginUser.getSalt()))){ //密码不正确
                throw new RuntimeException("用户名或密码错误");
            }else {
                return loginUser;
            }
        }
    }
}
